sharplife


software is a artwork, also make the life better !!!
随笔 - 125, 文章 - 0, 评论 - 73, 阅读 - 90167
  首页  :: 联系 :: 订阅 订阅  :: 管理

基于dojo实现mvc 模式下的ajax应用

Posted on   sharplife  阅读(4065)  评论(4编辑  收藏  举报

建议:了解mvc、ajax、至于dojo鉴于其强大及易用性可以边学边用

   好象谁也没料到我在项目中做起了client端ajax应用,不过还好我也感兴趣,幸好一直以来应用.net的同时也做过尝试,其原理还是很好理解的,至于ms的atlas我就没太多接触了,反正感觉基于client js库自己来ajax要自由、灵活多了,至于client的有助于ajax应用的pure js库也蛮多的,此次项目组选用dojo库(大概由于其强大又开源吧).

   本人要实现的其中一项应用是控制服务端返回来的音频、文字在客户端播放时的同步,相信都看到过baidu的歌曲试听吧,声文同步且支持拖放同步,此次实现多它一个功能,那就是点哪一句就播哪一句(当然我不是为了播放歌曲).简要说我在和服务器的交互中使用JSON(javascript object notation)传输数据,服务端用Newtonsoft的.net组件处理json数据序列化,至于具体的json格式那就你自己定义了,例如(最简单的): {
      Media : [{
      text : "......",
      start : "...",
            end : "...."
         },  ....]
         }
至于js下的mvc实现,或许许多人这样认为“js仅仅是个脚本而已”,大概应是ajax的出现改观了许多人对js的看法,其实用js可以写出完全面向对象的程序,因为js支持面向对象语言的几大重要特性,应是一直以来大家所见到的js脚本给大家造成了不好的印象,js原本就是面向对象的语言(我们见到许多由它写成的结构化的程序).看一下这篇文章,我的实现也是受它启发,延伸一点的就是引用dojo的事件订阅、发布机制.

   说一下上述陈述功能的具体的实现,在model方面实现首先实现一个容器型的model,解析json数据并拥有当前句信息、所有句信息(数组)、设定当前句方法,

ContainerModel

 

ItemModel

另一个model代表上述的一句的信息,包含text、startTime、endTime,并且订阅“/positionChange”事件(后面据mediaplayer定时发布),同时定义两方法(此处会于View中用dojo.event的connect将其连于特定的用户事件)用于发布当前对象被激活的事件,于view中同时会为controller订阅此对象激活所发布的事件,controller处理时会刷新container model的当前项同时更新view的表现(如添加样式),其中view对象除了为其他对象进行一些事件连接、订阅外,其render方法负责将container model的所有项render成特定的html元素(如span),其中决定model的显示形式,

Viewer - Controller

大概模式如下:
js mvc
图中对象初始化会subscribe合适的事件以待事件publish时进行处理,其中虚线表示一次用户点击处理,而自由线表示随播放进行处理文本同步(如加亮当前项)的过程,此过程在播放过程中持续进行。其实,事件发布并非图中所示指向特定对象(图中为了容易理解),是谁订阅谁处理,有AOP的意味!

相信有了这些,让这个模型运行起来是没问题了吧,忙中抽闲和大家分享,另外dojo的require不要忘了
dojo.require('dojo.lang.*');
dojo.require("dojo.event.*");
dojo.require("dojo.event.topic");
dojo.require("dojo.html.*");
dojo.require("dojo.json");
dojo.require("dojo.io.*");

脚本的开发还是比较困难的,从开发环境、或从其控制来讲,正如Pragmatic Programmer中所说的,“不完美的系统、荒谬的时间标度、可笑的工具、还有不可能实现的需求--在这样一个世界上,让我们安全‘驾驶’”!

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示